{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost Parameter Tuning for Otto Dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 直接调用xgboost内嵌的cv寻找最佳的参数n_estimators"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们以Kaggle 2015年举办的Otto Group Product Classification Challenge竞赛数据为例，进行XGBoost参数调优探索。\n",
    "\n",
    "竞赛官网：https://www.kaggle.com/c/otto-group-product-classification-challenge/data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先 import 必要的模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"Otto_train.csv\")\n",
    "#train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Variable Identification"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "选择该数据集是因为的数据特征单一，我们可以在特征工程方面少做些工作，集中精力放在参数调优上"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Target 分布，看看各类样本分布是否均衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "#sns.countplot(train.target);\n",
    "#pyplot.xlabel('target');\n",
    "#pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "每类样本分布不是很均匀"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# drop ids and get labels\n",
    "y_train = train['target']\n",
    "y_train = y_train.map(lambda s: s[6:])\n",
    "y_train = y_train.map(lambda s: int(s)-1)\n",
    "\n",
    "train = train.drop([\"id\", \"target\"], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "默认参数，此时学习率为0.1，比较大，观察弱分类数目的大致范围\n",
    "（采用默认参数配置，看看模型是过拟合还是欠拟合）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=None, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 9\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "             metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "  \n",
    "    cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    #train_predprob = alg.predict_proba(X_train)\n",
    "    #logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "   #Print model report:\n",
    "   # print (\"logloss of train :\" )\n",
    "   # print logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#params = {\"objective\": \"multi:softprob\", \"eval_metric\":\"mlogloss\", \"num_class\": 9}\n",
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb1, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113dc7d90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1oAAANGCAYAAADktv9+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3X2YbXdZH/zvnaRJTWAmAiJECJFK\nUXzjRVpAQZSmWBDfagsoairqo1SERx95CEU4oAS1NgKlllKVCFrFqoCBIkFeLIUABoiCvCOEhEAg\nInMgkBxJfv1jrUl29tlnzp49a2a/fT7Xta+cWXvtNb89M+fkfM99/+5VrbUAAAAwnBPmvQAAAIBV\nI2gBAAAMTNACAAAYmKAFAAAwMEELAABgYIIWAADAwAQtAACAgQlaAAAAAxO0AAAABiZoAWujqn67\nqq6rqq+f8NwTq6pV1cPGjm/0z72lqj5TVf9QVVdV1Z9V1Q9U1Skj557VX2P0cbiq/qqqHl9VJx7E\n+9xJVT2mqs6Z9zr2oqpOrapDVfXACc+d03/dz5rDus7o13X3g/7c81RVF1TV5+a9jiTpv/6tqm4z\n77UACFrAOnl8kk8k+Z2q+kfbB/vg9bQkF7TWLhw5fpck70jyH5L8nyQ/nOTbkzw2yceS/HaSJ0/4\nPP85yX37x79N8sYkv57kV4d/S7v2mCTnzHsRe3RqkqcmeeCE516R7uv+8YNcUO+MdOtaq6AFwGQn\nzXsBAAeltXa4qh6d5KJ0AempfeB6UZKr0gWxJElVnZTkpUluleSftdbeM3a5P6yqpye5x4RP9dHW\n2ptHPv6zqvq6JI9M8nODvSGO0lr7VJJPzXsdQ6qqU1trn5/3OgDYHRUtYK201v48yfOSPKmq7pXk\nUJJvTPLo1trWyKnfm+RuSZ4xIWRtX+uy1tpLp/zUW0n+YfRAVZ1QVU+oqvf2LY2frKoXVtUdxl9c\nVT/atyBeW1WfrqqXVNXXjJ1z56r6g6q6sr/eVVX1mu1Wtqr6SJKvTfKtI62NH9lp0f05z62qH6qq\n91TV5/t1fOeU73v0WidX1ZNH3u+nquoFVfVlY+d9e1W9vqr+rqq+UFUfrao/7lsGz8pNQeqpI+/j\ngv61R7UO9td6V1Xdt6re1F/zI1X17/rnH1pVb+/f2zur6jvG1vNV/To/0J/zsaq6cLQFtW9j/Mv+\nwxeMrOvQyDnfVVUX99f4bFW9uqruO/a5tlvf7llVf1RVf5/kQ/1zO35/j/E1f3x/va+a8NyvVNWR\n7Ta7qrpHVb28/zm8rv88r5j08ziLqvqWfr2f7b8Gb6qqhx7jvIv7n/WPVdUvVtWPjX9f97iWr6uq\nl1XV3/ef59Kq+pGxc07of17f1//MfKaq/rqqHjdyzpdV1fOr6vKRn+k3VtW/GGKdwHJT0QLW0c8n\neXCSP0pyxyTPa629euycs/v//ukM1z+huopYkmwm+e4k35HkV8bO+69JfiLJc5O8PMlZSX4xyQOr\n6p6ttauTpKrOTXJekt9Pcm6SW6cLiBdX1b1bax/or/e/kpyY5AlJPprkNknul+T0/vnv7d/zVroW\nwiS5bor389Ak907ylCSf66//kqq6a2vtb6d4farqhCQvS3L/dC2Ub0pyp3Qtm6+vqm9qrX2h/4v0\nK5K8IcmPJvlMkq9I9/U7OV1L4Hck+bMkv5XkN/tPcbwq1u2SvKD/3Feka//87aq6Y5LvT/f13erf\n40ur6s6ttSv7156R5O+SPLH/PLdK8iNJ3lJV92itvS/J25P8u/5z/FL/HtJ/rlTVDyT5vXTV1Ecm\nOaX/Or6+qh7UWvs/Y+v9kyR/kO4fBU7rjx3v+zvJ76b7uTsnI22u1e0XfFSSC1trV1fVaUleneTD\nSf59ugrv7ZJ8W5Jb7nD9qVTVt/bX/+skj073c/eYJBdW1SNbay/uz/uG/rz3p/safz7JT/ZrHURV\n3TXdz98nk/xMuu/to5JcUFVf3lrbbvF9QrrfZ7+U5H8n+UdJvjo3/3q/KMk907UXv79/7p7pfo8C\n66615uHh4bF2j3R/2W3p/uJ+iwnPv7J//pSx45XuH6m2HyeOPHdW/5pJjxeMnfvV/fH/Mnb9f9Yf\nf0b/8enp/rL5irHz7pjk2iS/13986/51jzvO+35Xktfv4uvU0u1ru+XIsS9Pcn2SJ+7iOo/or/V9\nY8e/qT/+U/3H/7r/+Bt3uNZt+nMOTXjunP65s0aOvb4/dq+RY7dK8sX+a3vGyPFv7M997A6f/8R0\nf+l+f5LzJ7yXc8bOPyHdnr6/TnLCyPFbpAs0bxw5dqi/xtPGrjHV9/cY6/3jJJePfe5/1V/vO/uP\n79V//N0zXP+CJJ87zjkX9+/1FiPHTkzyzn5t1R/7w3Rh/jZjX7+/Gf++HuPzbH/9brPDOb/f/965\n49jx/5XkmiSb/ccXJnnHcT7fZ5P8+m6/Zh4eHuvx0DoIrJ2+uvLYJDckuW26v1xP63HpWgC3H381\n4Zxnp6sA3TtdReBJ6YZi/P7IOd/W//eC0Re21t6a5D1JHtQfum+SL5lw3uVJXjty3qfTtZj9fFX9\nbN8GNtSf8a9rrX125HNfla4acKddXOM701WnLqyqk7YfSS5NF+Qe2J93aZIjSZ5fVT9SVXce4g0k\n+Xhr7W3bH7TWPp3uPVzabqpcJd3XPhl5b/1an1RV766qI+kC2pEkd0lys/bNY7hruqrYi1prN4ys\n4XPpQtB9qurUsdf88djHe/n+viDJHZKMtrP9u3Rf91f2H38wyd8n+ZWq+smqutuU1z6uvlr2z5P8\nUf+ekySttevTVYTukO5rlCTfmuS1ra/m9ufdkC6ADeXbk7ym/z006oJ0g1a22znfmuQbq+o3qurB\nVbUx4VpvTXJO32J4nxoZsgMgaAHr6P9L95epH0jygXQtZF8yds5H+/+Oh4n/kZtC1NuPcf0rWmuX\n9I/Xt9aema4l8N9U1YP7c7ZbiyZNx7ty5PmpzmuttXSh61XpWp7enuRTVfWcqtpr69ffTTh2XboA\nOK0vT1edO5KbB9V/SNeidpskaa19KF0g+GSS/5LkQ1X1odF9MTP69IRjR8aPt9aO9L/8xyOHz0/3\n/XtpkoelCw33Theyp/kaHO97eEKSLx07frNz9/j9fWV/ve09aV+a5LuSvLAPO2nd/sRvTRd0z0vy\nN/0eracNEB6+NF0l+FjvP7n5z/tVE86bdGxWt55yLc9M92fFfdJ9Df+u32P2TSOveXiS30nyY+mq\ndp+ubp/l7QZcL7CkBC1grfT/Uv/0dH/JfHG6VrOvSvKMsVO392x91+jB1tont0NUurahaf11/9/t\n6tl2eLn9hHPPSHL1Ls9L64ZzPLq1drt0FYJfT7cP5j/uYp375ep07+Xex3hs7xlLa+0NrbWHpdvf\ndp90f4F9VlU94qAX3XtUup+XJ7XWXtVae2v//Z/2Xk3H+x7ekK6aNKqNnzjr93ekcvQ9VXV6un9g\nOCVdpWv0vHe21h6RLmjcPcmL0+1Z2+ukzL9P9x6P9f6Tm/+8f/mE84YMLn83zVpaa19srZ3fWrtn\nulbTR6Zr2X3VdgWytXZ1a+3xrbWz0v2jzLlJvi9jFWhgPQlawNroW9V+J91fpB6XJK0bw35+ksdV\n1TePnP6SJO9ON53wqwf49NuT4T7Z//e1/X9vtsm/qu6drh3tNf2hi5N8YcJ5d0jfAjXpk7XW3t9a\n+6V0e2DuOfLUbitRQ3l5ur/AnzhS7Rt9vG/8Ba2161trb0k3nCG56X1sD/A4qPfRMjY0pJ+W9xVj\n5x1rXe9Lt0frB6qqRq5xWro9aRe3XY5v3+H7eywvSFele2S6f1y4uLX23mNcu7XW/qq19v+ma/ec\n5vo7rfWaJG9J8n2jleO+9fFR6QaGvL8//BdJvr1Gbjjcn/dv9rKGMa/pP8cZY8d/ON2evTePv6C1\n9pnW2h+lq7LeKt1+zPFzPtpae266f6TZ09cMWA2mDgLr5Nx0Awv+VWvtMyPHfyFdS9hvV9XdW2tf\naK1dX1Xfk65V661V9d/TDVX4+3QtcP88XXVq0uj3M6vqPv2vT0vXpnhuksvSTZNLa+19VfX8JI+t\nqhvStSadla5F7fJ01Yq01j5TVb+Y5LyqemG6fV63Tndj3GvTTe3bntb23CT/M1075JF0Qewbkvzy\nyNremeQRVfXwJH+b5NrW2jt380Wc0R8k+cEk/6uqnp1ub8s/pNuf821JXtZae0lV/WS/7leka9/8\nx+mmDybJnydJa+2zVXVZku+uqteka/+7urX2kX1a+8vT7cN5b7rK5L3STa68Yuy8D6ULxT9YVe9J\nN9ThytbalVX1hHRTB19eVf8tXUXp59P9LD3xeAvYxfd3otbae6vq4nQ/h3dMN+1y9Prfma469tJ0\nPxeVrjJzem6q7u7kxKr6/gnHr2mtvbL/vK9O8rqq+rV+/Y9J8nVJHtm3RiZdZflhSV5TVc9I9/X8\nydw0efGGTOdhVXVUxbkPS09Lt2fwddXdC+/T6X42H5rkCX0bZarqwnTDYy5JN23yTunutXdZkg9U\n1WaS16VrJ35vugr3vdNNxfyTKdcJrLJ5T+Pw8PDwOIhHulB0JMnzj/H8fdJN0jt/7PhGur8kvjU3\n3QvrqnRjuh+T5NSRc8/K0dMGv5CuovHrSW43du0T0u23eV+/tk+lHw4wYX2PTrcn6Lp0VYaXJrnb\nyPO3TVe12P4L/mf78x+fm087vFO68Hi4X99HjvN1a0meO+H4R5JcsMvvwUnp2tAu7b8un+3X+7wk\nXzXyffiT/vrXpqs+vj7Jw8au9aB0+5Su7dd4QX/8nEyeOviuY7yHlx/vPacLG7/Zf9+vSTd6/lv6\n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\nVTv69q6qOmiyr4S1qKoTq+qzVXVjVV1XVR+sqsPG+uxfVW+vqm9V1c1V9b+r6gFjfbb2Pzc39/3e\nVlWbJvtqWKuqenlVXVZVN/Ttwqp6zsh+Y77A+r/3rapOG9lmzBdM/17dxtq1I/u9ny+gqrp/Vb27\nqr5dVd+rqs9V1REj+407gtYUbU7y+SQn7GT/q5O8st//hCTXJvlYVR040uc9SQ5P8s/6dniSd23U\nBbNXjkry+0melOTYJPslObeqNo/0OS3J85Icn+QpSQ5I8uGq2jdJ+q8fSfez85S+3wuSvHVCr4E9\nd3WSX0/y+L59IsmHRt5sjfmCqqonJPmFJJeN7TLmi+mLSQ4ZaY8d2ef9fMFU1T2TnJ/k9iTPSfKo\nJK9K8t2RbsadpLWmTbklaUmeO/K4klyT5DUj2/ZP9xf4F/vHj+yPe+JInyf12w6b9mvSdjvm9+3H\n6mn94y1JbkvywpE+hya5I8mz+8fP6R8fOtLn+CS3JLnHtF+Ttuaxvz7JvzPmi9vShacrkjwzySeT\nnNZvN+YL2JJsS/K5nezzfr6ALcmbk3x6F/uNu5bWmorWjHpIkoOTnLuyobV2a5JPJTmy3/TkJDta\naxeN9PlMkh0jfZhdW/qv1/dfj0hyt9x5zL+Z5PLcecwv77ev+Gi6f7yPCDOtqvatquPTVSoujDFf\nZL+f5COttfPGthvzxfWwforY16vqvVX10H679/PF9DNJLq6q/9nfDvA3VfWykf3GnSSmDs6qg/uv\n28e2bx/Zd3CS61Y59rqRPsygqqokpyb569ba5f3mg5Pc1lr7zlj38TG/089E3/+2GPOZVVWPraqb\nktya5B1Jntda+1KM+ULqw/Q/SXLiKruN+WK6KMmLkzw7ycvSjdMFVXXveD9fVA9N8vIkX0037u9I\n8raqenG/37iTpLtPhNnVxh7X2Lbx/av1YfacnuQn091/sTvGfP79bbp59welu9fmf1TVUbvob8zn\nVFU9MMnvJXlWa+2WPTk0xnxutdbOGXn4haq6MMnfJXlJks+sdBs7zJjPt32SXNxae23/+G/6e29f\nnuTMkX7GfcmpaM2mldWKxn+jcb/8429Hrk3yY6sce9/c9TcozIiqenu6KQdPb61dPbLr2iSb+hts\nR42P+Z1+Jvr+d4sxn1mttdtaa19rrV3cWjsx3SI4/ynGfBEdkW78Lqmq71fV99MthPPL/ffbY8wX\nXmvt5iRfSPKweD9fVNck+dLYti8n2dp/b9xJImjNqq+n+wt47MqGfmnfo5Jc0G+6MMmWqvrpkT5P\nTHfvzwVhpvTLvJ6e5PlJntFa+/pYl0vSrV40OuaHJHlM7jzmj+m3r3hWuilpl2zUtTO4Sne/jTFf\nPB9Pt9rc4SPt4iR/OvK9MV9wVbV/uoUOron380V1fpLDxrY9PMlV/ffGnc60V+NY1pZuVaqVN+KW\n5BX991v7/a9JtzrN89K9Cb8nyTeTHDhyjnPS/Xb8SX27LMnZ035t2qrj/Qf9eB6V7jdcK+3uI33+\na5L/l+SYJI9L95+2zyXZt9+/b7rfkp7X7z+m7//2ab8+bafjfkqSpyZ5cLr/gP9muhXljjXmy9Ey\nsuqgMV/MluR3+n/bH5LkiUnOTnJDkgf1+72fL1hLt1z77Ulem+QnkvxckpuTvGikj3HXBK2p/cEn\nR6cLWOPtjH5/pVsy9pp0y/p+Ksljxs5xryTv7v9Bv6H//qBpvzZt1fFebaxbkpeO9PmRJG9P8u0k\n3+vfrB84dp6tST7c7/9233//ab8+bafj/t+SXJmuGnFd/5/nY4358rTcNWgZ8wVrSd7b/wf6tiTf\nSPLnSR41st/7+QK2JP8i3S9Fbkk3bfBlY/uNu5bqBxoAAICBuEcLAABgYIIWAADAwAQtAACAgQla\nAAAAAxO0AAAABiZoAQAADEzQAgAAGJigBQAAMDBBC4ClVlVXVtWvTPs6AFgsghYAS6GqXlpV311l\n1xOS/NEEnl+gA1gi+037AgBgmlprfz/ta9gTVbWptXbbtK8DgF1T0QJgoqrqk1X1tqr67aq6vqqu\nraptazx2S1X9UVVdV1U3VNUnquqnRvb/VFX9ZVXd2O+/pKoeX1VHJ3lnki1V1fq2rT/mTpWmft8v\nVtWHq+p7VfXlqnpyVf1Ef+03V9WFVfXjI8f8eFV9qKq2V9VNVfXZqnrm6GtO8qAkv7vy/CP7XlBV\nX6yqW/tredXYa76yql5fVWdU1Y4kf1xVm6rq9Kq6pqpu6fucuEcDAcCGErQAmIaXJLk5yROTvDrJ\nSVV17K4OqKpK8pEkByc5LskRSS5N8vGqulff7U+TXJ1uOuARSd6c5PYkFyT5lSQ3JDmkb7+zi6d7\nQ5Izkxye5CtJ3pPkD5O8Kcnj+z6nj/Q/IMn/SfLMJI9L8tEkZ1fV1n7/8/vrOmnk+VNVRyR5X5L3\nJnlskm1JTq6ql45dz68lubx/TScn+eUkP5PkZ5McluTnk1y5i9cDwISZOgjANFzWWntj//1Xq+qE\nJMck+dgujnl6ujByv9barf22X62q5yb5l+nus9qa5C2tta+snHvl4L4a1Fpr167h+t7ZWntff9xv\nJbkwycmttY/2234vXYUs6U76+SSfHzn+9VX1vHRh6PTW2vVVdUeSG8ee/5VJPt5aO7l/fEVVPSpd\nsDpjpN8nWms/DIZ9gPtqkr9urbUkV63hNQEwQSpaAEzDZWOPr0lyv90cc0S6ytG3++l5N1XVTUke\nkmRlGt+pSf6kqs6rql8fnd63F9e3vf/6hbFtP1JV90iSqtrcT4X8UlV9t7+uR6QLfrvyyCTnj207\nP8nDqmrfkW0Xj/U5I1217W/7aZjP2u0rAmCiBC0ApuH2scctu39P2iddIDt8rB2W5C1J0lrbluTR\n6aYYPiPJl/rK0t5cX9vFtpVrfkuSFyR5XZKn9tf1hSSbdvM8NXKu0W3jbh590Fq7NF3AfEOSuyd5\nX1W9fzfPBcAEmToIwLy4NN39Wd9vrV25s06ttSuSXJFu4Yk/S/JvknwgyW1J9t3ZcXvpqUnOaK19\nIEmq6oAkDx7rs9rzfynJU8a2HZnkitbaHbt6wtbaDUnOSnJWH7L+oqru1Vq7fn0vAYAhqWgBMC/O\nS3ev1Aer6tlV9eCqOrKqfqNfWfDu/Up8R1fVg6rqn6ZbFOPL/fFXJjmgqo6pqvtU1Y8OeG1fS/L8\nqjq8XwXxPbnre+yVSZ5WVfevqvv0296a5JiqekNVPbyqXpLkhOx6oY5U1Suq6viqekRVPTzJv0py\nbZLVPicMgCkQtACYC/2iD8cl+ask/z1d1eq96SpH25PckeTe6VYLvCLdan7nJPnP/fEXJHlHuirQ\n36db7XAor0jynXSrG56dbtXBS8f6nNRf69/1z78yBfBnkxyfblXB/5LkpNbaGbt5vpuSvCbdvVuf\n7c97XGvtB3v9SgAYRHXvWwAAAAxFRQsAAGBgghYAM6GqXjS6bPtY++K0rw8A9oSpgwDMhKo6MMmP\n7WT37a01H8oLwNwQtAAAAAZm6iAAAMDABC0AAICBCVoAAAADE7QAAAAGJmgBAAAMTNACAAAYmKAF\nAAAwsP8PSC3ZtQll35IAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113dc7d10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "\n",
    "cvresult = cvresult.iloc[100:]\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(100,cvresult.shape[0]+100)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(10, 10), dpi=100)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators_detail.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
